// @ts-ignore
import CryptoJS from 'crypto-js/crypto-js';

/**
 * 加密配置文件
 * @param options 配置
 */
const getOptions = (options: any) => {
  if (options == null) {
    options = {};
  }
  if (!options.hasOwnProperty('mode') || options.mode == null) {
    options.mode = CryptoJS.mode.ECB;
  }
  if (!options.hasOwnProperty('padding') || options.padding == null) {
    options.padding = CryptoJS.pad.Pkcs7;
  }
  return options;
};

/**
 * 加密
 * @param key 加密的key
 * @param content 需要加密的数据
 * @param options 配置文件
 */
export const encryptAES = (key: string, content: any, options: any) => {
  // 如果传入的是对象，json转成字符串
  if (typeof content != 'string') {
    content = JSON.stringify(content);
  }
  // 编码
  key = CryptoJS.enc.Utf8.parse(key);
  content = CryptoJS.enc.Utf8.parse(content);
  options = getOptions(options);
  // 加密
  const encrypted = CryptoJS.AES.encrypt(content, key, options);
  const result = encrypted.ciphertext.toString();
  // 将密文转为Base64的字符串
  var base64Str = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(result));
  return base64Str;
};
/**
 * 解密
 * @param key 解密的key
 * @param content 需要解密的数据
 * @param options 配置文件
 */
export const decryptAES = (key: string, content: string, options: any) => {
  //若上面加密返回的hexStr,需打开下面两行注释，再次处理
  //const encryptedHexStr = fun_aes.CryptoJS.enc.Hex.parse(word);
  //const srcs = fun_aes.CryptoJS.enc.Base64.stringify(encryptedHexStr);
  options = getOptions(options);
  key = CryptoJS.enc.Utf8.parse(key);
  // 解密
  const decrypt = CryptoJS.AES.decrypt(content, key, options);
  const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
};

/**
 * ECB加密方式
 * @param key 密钥
 * @param context 加密对象
 */
export const encryptECB = (key: string, context: any) => {
  return encryptAES(key, context, null);
};
/**
 * ECB解密方式
 * @param key 密钥
 * @param context
 */
export const decryptECB = (key: string, context: string) => {
  return decryptAES(key, context, null);
};
/**
 * CBC加密方式
 * @param key 密钥
 * @param iv 向量
 * @param context 加密对象
 */
export const encryptCBC = (key: string, iv: string, context: any) => {
  return encryptAES(key, context, {
    mode: CryptoJS.mode.CBC,
    iv: CryptoJS.enc.Utf8.parse(iv),
  });
};
/**
 * CBC解密方式
 * @param key 密钥
 * @param iv 向量
 * @param context
 */
export const decryptCBC = (key: string, iv: string, context: any) => {
  return decryptAES(key, context, {
    mode: CryptoJS.mode.CBC,
    iv: CryptoJS.enc.Utf8.parse(iv),
  });
};
